﻿using ATEC.ATDataCoreNET;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace LevelExample
{
    /// <summary>
    /// 分类：玄镜BIM图形平台/C#开发/示例代码/颜色映射/颜色索引与RGB转换。
    /// 内容：展示如何在玄镜BIM平台中将RGB颜色值与颜色索引进行互相转换，并提供打印方法输出结果。
    /// 功能：
    /// - 通过颜色映射实现RGB颜色与颜色索引的双向转换。
    /// - 提供辅助函数用于输出转换结果，便于调试和验证。
    /// 关键类及说明：
    /// - **RgbColorDef**: 表示RGB颜色，包括R（红）、G（绿）、B（蓝）三个通道的值。
    /// - **ATColorMap**: 提供颜色映射功能，用于管理颜色索引与RGB颜色之间的关系。
    /// - **SSDPNET.ATDlgFuncs**: 提供对话框输出功能，用于显示信息。
    /// 注意：
    /// - 操作依赖当前活动工程和场景，应确保工程已正确加载。
    /// - 颜色映射可能因工程配置不同而变化。
    /// </summary>
    public class ColorExample
    {
        /// <summary>
        /// 将RGB颜色转换为颜色索引
        /// </summary>
        /// <param name="colorDef">RGB颜色定义对象</param>
        /// <returns>对应的颜色索引</returns>
        public static uint RGBToIndex(RgbColorDef colorDef)
        {
            // 获取当前活动场景的工程. 
            ATEC.ATDataCoreNET.ATProject atProject = SSDPNET.ScenesFunctions.SceneRefGetActive().GetATProject();

            // 获取颜色映射对象，用于查找颜色索引.
            ATColorMap colorMap = ATColorMap.GetForFile(atProject);

            // 查找最接近指定RGB颜色的索引.
            uint index = colorMap.FindClosestMatch(colorDef);
            return index; // 返回找到的索引值.
        }

        /// <summary>
        /// 根据颜色索引获取对应的RGB颜色
        /// </summary>
        /// <param name="index">颜色索引值</param>
        /// <returns>对应的RGB颜色定义对象</returns>
        public static RgbColorDef IndexToRGB(int index)
        {
            // 获取当前活动场景的工程.
            ATEC.ATDataCoreNET.ATProject atProject = SSDPNET.ScenesFunctions.SceneRefGetActive().GetATProject();

            // 获取颜色映射对象.
            ATColorMap colorMap = ATColorMap.GetForFile(atProject);

            // 根据索引获取对应的RGB颜色.
            RgbColorDef colorDef = colorMap.GetColor(index);
            return colorDef; // 返回RGB颜色定义.
        }

        /// <summary>
        /// 打印RGB颜色到索引的转换结果
        /// </summary>
        /// <param name="colorDef">RGB颜色定义对象</param>
        public static void Print_RGBToIndex(RgbColorDef colorDef)
        {
            // 构造RGB颜色的字符串表示.
            string rgbStr = "RGB:" + colorDef.R.ToString() + "," + colorDef.G.ToString() + "," + colorDef.B.ToString();

            // 获取与指定RGB颜色最接近的颜色索引.
            uint index = RGBToIndex(colorDef);

            // 构造索引值的字符串表示.
            string indexStr = "index:" + index.ToString();

            // 拼接输出字符串.
            string str = rgbStr + "," + indexStr;

            // 打印结果到对话框.
            SSDPNET.ATDlgFuncs.DialogDmsgsPrint(str);
        }

        /// <summary>
        /// 打印颜色索引到RGB颜色的转换结果
        /// </summary>
        /// <param name="index">颜色索引值</param>
        public static void Print_IndexToRGB(int index)
        {
            // 根据索引值获取对应的RGB颜色定义.
            RgbColorDef colorDef = IndexToRGB(index);

            // 构造RGB颜色的字符串表示.
            string rgbStr = "RGB:" + colorDef.R.ToString() + "," + colorDef.G.ToString() + "," + colorDef.B.ToString();

            // 构造索引值的字符串表示.
            string indexStr = "index:" + index.ToString();

            // 拼接输出字符串.
            string str = indexStr + "," + rgbStr;

            // 打印结果到对话框.
            SSDPNET.ATDlgFuncs.DialogDmsgsPrint(str);
        }
    }
}
